package com.tjetc;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.lang.reflect.Array;
import java.util.Arrays;

public class _21PolymorphicApplicationExercise {
    public static void main(String[] args) {
        /*
                定义员⼯类Employee,包含姓名和⽉⼯资,以及计算年⼯资getAnnual的⽅法。普通员⼯和经理
            继承了员⼯，经理类多了奖⾦bonus属性和管理manage⽅法，普通员⼯类多了work⽅法，普通员
            ⼯和经理类要求分别重写getAnnual⽅法
                测试类中添加⼀个⽅法showEmpAnnual(Employee e),实现获取任何员⼯对象的年⼯资，并在
            main⽅法中调⽤该⽅法 e.getAnnual(）
                测试类中添加⼀个⽅法，testWork,如果是普通员⼯，则调⽤work⽅法，如果是经理，则调⽤
            manage⽅法

            思考方式：问题拆分的一个能力
            1.输入输出处理逻辑 一段逻辑 一个方法的实现逻辑
            2.把大逻辑拆分一个一个小逻辑 最后还是要走到方法中

            思路分析：
            1. 分析题目中有多少类？
            类： Employee
                属性：
                    String name
                    double salary
                方法：
                    getAnnual() : 计算年工资 （方法名）
                 输入（形参）
                    工资
                 输出 （返回值）
                    年工资
                 处理逻辑 （方法体）
                    计算：工资 * 12


            类：Worker
                属性：无
                方法：
                    work(): 描述工作
            类：Manager
                属性：
                    double bonus
                方法：
                    manage() : 描述管理

             类： 测试类（当前类）
                属性：无
                方法：
                    showEmpAnnual(Employee e)： 获取任何员⼯对象的年⼯资
                    testWork 各个职位输出对应的工作内容
             2.类之间的关系？
                Worker 和 Manager extends Employee

                方法重写
                    重写getAnnual⽅法
              3. 对象之间的交互
            注意：代码千万不要一次性写完！！！！大忌！！！ 能尽可量的把测试范围缩小！
         */

//        Manager manager = new Manager(10000);
        Employee manager = new Manager(10000);
//        ((Manager)manager).manage();
        manager.setName("zhangsan");
        manager.setSalary(100);


//        Worker worker = new Worker();
        Employee worker = new Worker();
        worker.setName("lisi");
        worker.setSalary(10);


        _21PolymorphicApplicationExercise test = new _21PolymorphicApplicationExercise();
        test.showEmpAnnual(manager);
        test.showEmpAnnual(worker);

        test.testWork(manager);
        test.testWork(worker);
    }

    public void showEmpAnnual(Employee e) {
        System.out.println(e.getAnnual());
    }

    public void testWork(Employee e) {
        if (e instanceof  Manager) {
            ((Manager) e).manage();
        }else if (e instanceof Worker) {
            ((Worker) e) .work();
        }
    }

}

/**
 * 经理类
 *
 * @author gyx
 * @version 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
class Manager extends Employee{
    private double bonus;

    /**
     * 管理过程
     */
    public void manage() {
        System.out.println(getName() + "在管理");
    }

    /**
     * 获取年工资
     *
     * @return 基本年工资 + 奖金
     */
    @Override
    public double getAnnual() {
        return super.getAnnual() + bonus;
    }
}



/**
 * 工人类
 *
 * @author gyx
 * @version 2.0
 * @since 1.0
 */
@Data
@NoArgsConstructor
// @AllArgsConstructor
class Worker extends Employee{
    /**
     * 描述工作的过程
     *
     *
     */
    public void work() {
        System.out.println(getName() + "在工作");
    }

    @Override
    public double getAnnual() {
        return super.getAnnual();
    }
}


/**
 * 员工类
 *
 * @author gyx
 * @version 1.0
 *
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
class Employee {
    /**
     * 员工姓名
     */
    private String name;
    /**
     * 员工工资
     */
    private double salary;


    /**
     * 计算年工资
     * @return 根据月工资 * 12 得到的年工资
     */
    public double getAnnual() {
        return salary * 12;
    }



}


